home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Toolbox / Visual Basic Toolbox (P.I.E.)(1996).ISO / forms / dbgrid1 / form1.frm next >
Text File  |  1995-10-16  |  25KB  |  798 lines

  1. VERSION 4.00
  2. Begin VB.Form Form1 
  3.    Caption         =   "Form1"
  4.    ClientHeight    =   6090
  5.    ClientLeft      =   3390
  6.    ClientTop       =   1965
  7.    ClientWidth     =   5580
  8.    Height          =   6495
  9.    Left            =   3330
  10.    LinkTopic       =   "Form1"
  11.    ScaleHeight     =   6090
  12.    ScaleWidth      =   5580
  13.    Top             =   1620
  14.    Width           =   5700
  15.    Begin VB.CommandButton cmdUnselectRows 
  16.       Caption         =   "Unselect Rows"
  17.       Height          =   372
  18.       Left            =   3600
  19.       TabIndex        =   11
  20.       Top             =   5400
  21.       Width           =   1452
  22.    End
  23.    Begin VB.TextBox Text2 
  24.       Height          =   390
  25.       Left            =   1635
  26.       TabIndex        =   3
  27.       Text            =   "0"
  28.       Top             =   4350
  29.       Width           =   480
  30.    End
  31.    Begin VB.TextBox Text1 
  32.       Height          =   390
  33.       Left            =   720
  34.       TabIndex        =   2
  35.       Text            =   "0"
  36.       Top             =   4350
  37.       Width           =   480
  38.    End
  39.    Begin VB.CommandButton cmdSelectCols 
  40.       Caption         =   "Sel &Cols"
  41.       Height          =   375
  42.       Left            =   2400
  43.       TabIndex        =   1
  44.       Top             =   4320
  45.       Width           =   1080
  46.    End
  47.    Begin VB.CommandButton cmdGetBookmark 
  48.       Caption         =   "Save Cur Row"
  49.       Height          =   372
  50.       Left            =   240
  51.       TabIndex        =   9
  52.       Top             =   4920
  53.       Width           =   1452
  54.    End
  55.    Begin VB.CommandButton cmdSetBookmark 
  56.       Caption         =   "GoTo Saved Row"
  57.       Height          =   372
  58.       Left            =   240
  59.       TabIndex        =   8
  60.       Top             =   5400
  61.       Width           =   1452
  62.    End
  63.    Begin VB.CommandButton cmdPhonyDCFirst 
  64.       Caption         =   "|<"
  65.       Height          =   252
  66.       Left            =   240
  67.       TabIndex        =   7
  68.       Top             =   240
  69.       Width           =   252
  70.    End
  71.    Begin VB.CommandButton cmdPhonyDCPrevious 
  72.       Caption         =   "<"
  73.       Height          =   252
  74.       Left            =   480
  75.       TabIndex        =   13
  76.       Top             =   240
  77.       Width           =   252
  78.    End
  79.    Begin VB.CommandButton cmdPhonyDCNext 
  80.       Caption         =   ">"
  81.       Height          =   252
  82.       Left            =   2280
  83.       TabIndex        =   14
  84.       Top             =   240
  85.       Width           =   252
  86.    End
  87.    Begin VB.CommandButton cmdPhonyDCLast 
  88.       Caption         =   ">|"
  89.       Height          =   252
  90.       Left            =   2520
  91.       TabIndex        =   15
  92.       Top             =   240
  93.       Width           =   252
  94.    End
  95.    Begin VB.CommandButton cmdDeleteCurrent 
  96.       Caption         =   "Delete Current"
  97.       Height          =   372
  98.       Left            =   1920
  99.       TabIndex        =   16
  100.       Top             =   4920
  101.       Width           =   1452
  102.    End
  103.    Begin VB.CommandButton cmdSelectRows 
  104.       Caption         =   "Select Rows"
  105.       Height          =   372
  106.       Left            =   3600
  107.       TabIndex        =   17
  108.       Top             =   4920
  109.       Width           =   1452
  110.    End
  111.    Begin VB.CommandButton cmdWildCard 
  112.       Caption         =   "Wild Card"
  113.       Height          =   372
  114.       Left            =   1920
  115.       TabIndex        =   18
  116.       Top             =   5400
  117.       Width           =   1452
  118.    End
  119.    Begin VB.CommandButton cmdAddNew 
  120.       Caption         =   "Add New"
  121.       Height          =   375
  122.       Left            =   3840
  123.       TabIndex        =   0
  124.       Top             =   4320
  125.       Width           =   1215
  126.    End
  127.    Begin VB.Shape Shape1 
  128.       Height          =   855
  129.       Left            =   120
  130.       Top             =   3960
  131.       Width           =   3495
  132.    End
  133.    Begin VB.Label Label3 
  134.       Caption         =   "to:  "
  135.       Height          =   285
  136.       Left            =   1335
  137.       TabIndex        =   6
  138.       Top             =   4320
  139.       Width           =   225
  140.    End
  141.    Begin VB.Label Label2 
  142.       Caption         =   "from:  "
  143.       Height          =   240
  144.       Left            =   300
  145.       TabIndex        =   5
  146.       Top             =   4350
  147.       Width           =   330
  148.    End
  149.    Begin VB.Label Label4 
  150.       Caption         =   "Select Columns in code"
  151.       BeginProperty Font 
  152.          name            =   "MS Sans Serif"
  153.          charset         =   0
  154.          weight          =   400
  155.          size            =   9.75
  156.          underline       =   -1  'True
  157.          italic          =   0   'False
  158.          strikethrough   =   0   'False
  159.       EndProperty
  160.       Height          =   285
  161.       Left            =   360
  162.       TabIndex        =   4
  163.       Top             =   3960
  164.       Width           =   2175
  165.    End
  166.    Begin MSDBGrid.DBGrid DBGrid1 
  167.       Height          =   3015
  168.       Left            =   120
  169.       OleObjectBlob   =   "Form1.frx":0000
  170.       TabIndex        =   12
  171.       Top             =   720
  172.       Width           =   5295
  173.    End
  174.    Begin VB.Label Label1 
  175.       Alignment       =   2  'Center
  176.       BackColor       =   &H00FFFFFF&
  177.       BorderStyle     =   1  'Fixed Single
  178.       Caption         =   "Phony Data Control"
  179.       Height          =   255
  180.       Left            =   720
  181.       TabIndex        =   10
  182.       Top             =   240
  183.       Width           =   1575
  184.    End
  185. End
  186. Attribute VB_Name = "Form1"
  187. Attribute VB_Creatable = False
  188. Attribute VB_Exposed = False
  189.  
  190. '==================================================================='
  191. '
  192. 'The following text contains a sample for manipulating data in an
  193. 'Unbound grid using an array for data storage.
  194. '
  195. '==================================================================='
  196.  
  197. 'Data storage variables.  Dimensions and a place to put the data
  198. Dim MaxRow As Integer       ' number of rows in array
  199. Dim MaxCol As Integer       ' number of columns in array
  200. Dim dataval() As Variant    ' a variable array to store the data.
  201.  
  202. 'Other global variables
  203. Dim ToMe As Variant         ' a bookmark for Get/Set Bookmark tests
  204.  
  205. Private Sub Form_Activate()
  206. loadedflag = 1
  207.  
  208. End Sub
  209.  
  210. Private Sub Form_Load()
  211.     
  212.     'Set up, allocate and fill the data array.  For this example
  213.     'the data is manufactured for simplicity.  The user is queried
  214.     'for the initial number of rows.
  215.     
  216.     'The number of columns is taken as the number of columns set
  217.     'up in the property pages.  Get to the property pages by
  218.     'right-clicking on the grid at design time.  Select "Edit" to
  219.     'get to the layout editor.  Columns can be inserted,appended and
  220.     'deleted from the layout editor.  You must set focus to another control on
  221.     'to leave the layout editor.  You can tell the grid is in the layout
  222.     'editor by the cursor that is visible in the grid.  Column properties
  223.     'can be changed by selecting "Properties" from the pop-up menu.
  224.     
  225.     'Get the dimensions of the data storage array, dataval
  226.     MaxRow = 10 'Val(InputBox("Enter number of starting rows"))
  227.     MaxCol = DBGrid1.Columns.Count
  228.  
  229.     'If zero initial rows are requested, additional set is
  230.     'unnecessary
  231.     If MaxRow <= 0 Then Exit Sub
  232.  
  233.     'The data array, dataval, is allocated with the
  234.     'columns as the first index.  Columns are first since
  235.     'the column count is fixed, and the number of rows may
  236.     'change.  This allows us to "ReDim Preserve" for added
  237.     'and deleted rows.
  238.  
  239.     ReDim dataval(0 To MaxCol - 1, 0 To MaxRow - 1)
  240.     
  241.     Dim row, col As Integer
  242.     
  243.     For row = 0 To MaxRow - 1
  244.        For col = 0 To MaxCol - 1
  245.           dataval(col, row) = "(R" & row & ", C" & col & ")"
  246.        Next col
  247.     Next row
  248.  
  249. End Sub
  250.  
  251. 'These routines demonstrate Unbound grid manipulations
  252. 'through VBA code.
  253. '
  254. Private Sub cmdAddNew_Click()
  255.     
  256.     'This button event positions the user to
  257.     'the Grid AddNew row.
  258.     
  259.     If DBGrid1.AllowAddNew Then
  260.     
  261.         If MaxRow > 0 Then
  262.             'position to the last row.  Moving twice causes
  263.             'a pending AddNew to update, and then become the
  264.             'last row for the second MoveLast
  265.             cmdPhonyDCLast_Click   'defined below
  266.            
  267.             cmdPhonyDCLast_Click
  268.         End If
  269.  
  270.         'position to the next grid row
  271.         DBGrid1.col = 0
  272.         DBGrid1.row = DBGrid1.row + 1
  273.     End If
  274.     
  275.     DBGrid1.SetFocus
  276.  
  277. End Sub
  278.  
  279. Private Sub cmdGetBookmark_Click()
  280.  
  281.     'This button event obtains the bookmark for the
  282.     'current row and stores it for later use by the
  283.     '"Set Bookmark" button.
  284.  
  285.     ToMe = DBGrid1.bookMark
  286. End Sub
  287.  
  288. Private Sub cmdSetBookmark_Click()
  289.  
  290.     'This button event moves to the row which was current
  291.     'the last time the "Get Bookmark" button was pressed.
  292.  
  293.     DBGrid1.bookMark = ToMe
  294. End Sub
  295.  
  296. Private Sub cmdDeleteCurrent_Click()
  297.     'This button event deletes the current row
  298.     
  299.     On Error GoTo BadBkmk
  300.     
  301.     'the current row must be selected to delete it
  302.     DBGrid1.SelBookmarks.Add DBGrid1.bookMark
  303.     DBGrid1.SetFocus
  304.     SendKeys "{DEL}"
  305.     Exit Sub
  306.     
  307. BadBkmk:
  308.     MsgBox "There are no rows to delete."
  309. End Sub
  310.  
  311. Private Sub cmdWildCard_Click()
  312.  
  313.     'This button event allows the user to position
  314.     'to any row within the grid by generating a bookmark
  315.     'and positioning the grid.  This can only be done
  316.     'because our VBA code as knowledge of the internal
  317.     'meaning of the bookmark.
  318.     '
  319.     'Note that the VBA makeBookmark() function is used
  320.     'to manufacture the bookmark.
  321.  
  322.     Dim result As Integer
  323.     result = Val(InputBox("Enter row number"))
  324.     DBGrid1.bookMark = makeBookmark(result)
  325. End Sub
  326.  
  327. Private Sub cmdSelectCols_Click()
  328. 'select columns specified in textboxes
  329. 'workaround
  330.  
  331.     Dim hi As Integer
  332.     Dim lo As Integer
  333.     
  334.     
  335.     lo = Val(Text1.Text)
  336.     hi = Val(Text2.Text)
  337.         
  338.     'workaround::needs to be reset
  339.     DBGrid1.SelStartCol = 0
  340.     
  341.     'workaround::if columns with higher index numbers are previously_
  342.     'selected, the selection will not take place
  343.     If DBGrid1.SelEndCol > hi Then
  344.         DBGrid1.SelEndCol = hi
  345.     End If
  346.     
  347.     'workaround::notice Start is assigned the higher number_
  348.     'and it is assigned twice
  349.     DBGrid1.SelStartCol = hi
  350.     DBGrid1.SelStartCol = hi
  351.     DBGrid1.SelEndCol = lo
  352.  
  353. End Sub
  354.  
  355. Private Sub cmdSelectRows_Click()
  356.  
  357.     'This button event causes every other visible row to be
  358.     'selected, starting with the first row.
  359.  
  360.     Dim rowbmk As Variant
  361.     Dim rowcnt As Long
  362.     Dim row As Long
  363.     
  364.     'position to the first row on the grid
  365.     DBGrid1.bookMark = DBGrid1.FirstRow
  366.     
  367.     'get count of visible rows
  368.     rowcnt = DBGrid1.VisibleRows
  369.         
  370.     'select every other row.  It is possible that we may request
  371.     'an invalid bookmark (passed EOF, i.e. the AddNew line), so we
  372.     'include some error processing to handle this.
  373.     
  374.     On Error GoTo LoopExit
  375.     For row = 0 To rowcnt Step 2
  376.         rowbmk = DBGrid1.GetBookmark(row)
  377.         DBGrid1.SelBookmarks.Add rowbmk
  378.     Next row
  379.     
  380. LoopExit:
  381.     Exit Sub
  382.  
  383. End Sub
  384.  
  385. Private Sub cmdUnselectRows_Click()
  386.  
  387.     'This button event deselects all Selected Rows
  388.     
  389.     While DBGrid1.SelBookmarks.Count
  390.         DBGrid1.SelBookmarks.Remove 0
  391.     Wend
  392.  
  393. End Sub
  394. '
  395. 'Utility Functions
  396. '
  397. Private Function isAddNew() As Boolean
  398.  
  399.     'This function determines if an AddNew is being processed
  400.     
  401.     'For an AddNew to be in operation, the grid must
  402.     'be in a modified state.
  403.     
  404.     'If DBGrid1.DataChanged Then     'True DBGrid only
  405.  
  406.         'if there is currently no data, it must be AddNew
  407.         If MaxRow = 0 Then
  408.             isAddNew = True
  409.             Exit Function
  410.         End If
  411.         
  412.         'the modified row is an AddNew and not an update
  413.         'if the current row bookmark and current row are
  414.         'not indicating the same row.  This happens because
  415.         'an AddNew does not change the current row (in the
  416.         'database sense), but a different physical row of
  417.         'the grid is being editted.
  418.         
  419.         Dim curindex, topindex As Integer
  420.         curindex = GetArrayIndex(DBGrid1.bookMark, False)
  421.         topindex = GetArrayIndex(DBGrid1.FirstRow, False)
  422.         If (curindex - topindex) <> DBGrid1.row Then
  423.             isAddNew = True
  424.             Exit Function
  425.         End If
  426.     
  427.     'End If
  428.  
  429.     isAddNew = False
  430.  
  431. End Function
  432.  
  433. 'The following functions manage the data array
  434. 'addressing, both through indices and bookMarks
  435. 'and provide appropriate conversion from array
  436. 'indices to bookmarks and back again.
  437. '
  438. Private Function isInvalidIndex(ByVal rindex As Integer) As Boolean
  439.     
  440.     If rindex < 0 Or rindex >= MaxRow Then
  441.         isInvalidIndex = True
  442.     Else
  443.         isInvalidIndex = False
  444.     End If
  445.  
  446. End Function
  447.  
  448. Private Function makeBookmark(rindex As Integer) As Variant
  449.  
  450.     'It is important that bookmarks be generated in a
  451.     'consistant manner throughout the code.  The importance
  452.     'of this cannot be overstressed.
  453.     '
  454.     'The grid handles bookmarks as "blackbox" objects - i.e.
  455.     'as objects for which the internal data has no meaning.
  456.     'This means that "01" and " 1" and "1" are all considered
  457.     'different, even though the interpretted numeric value is
  458.     'the same.
  459.     '
  460.     'Therefore, care must be taken to avoid using different
  461.     'means for generating bookmarks which refer to the same
  462.     'row.  For example,
  463.     '
  464.     '              Format$(1) produces the string "1"
  465.     '   while,     Str$(1) will generate " 1".
  466.     '
  467.     'These are clearly different in the blackbox sense and
  468.     'so will be treated differently by the grid, even though
  469.     'both strings are derived from the same numeric value.
  470.     '
  471.     'To avoid such difficulties, we use a single VBA function
  472.     'to manage the creation of bookmarks, thus insuring
  473.     'consistency.  If the method of generation must change
  474.     'as the code evolves, we can simply change this function
  475.     'and still guarrantee bookmark consistency.
  476.     
  477.     makeBookmark = Str(rindex)
  478.     
  479. End Function
  480.  
  481. Private Function GetArrayIndex(bookMark As Variant, _
  482.               ReadPriorRows As Boolean) As Integer
  483.     
  484.     If IsNull(bookMark) Then
  485.         
  486.         'A Null bookmark indicates BOF or EOF, depending upon
  487.         'direction.  If the grid is requesting ReadPriorRows,
  488.         'then Null refers to EOF.  If ReadPriorRows is not
  489.         'True valued, then Null represents BOF
  490.  
  491.         If ReadPriorRows Then
  492.             GetArrayIndex = MaxRow  'EOF of the array
  493.         Else
  494.             GetArrayIndex = -1      'BOF of the array
  495.         End If
  496.         Exit Function
  497.     
  498.     Else
  499.         
  500.         'Determine the array index from the bookmark.  This
  501.         'function must invert the bookmark construction process
  502.         'of the makeBookmark() function.  Again, this is handled
  503.         'in a single function to assure consistency and allow
  504.         'easy methodology changes as our code evolves.
  505.  
  506.         Dim bk As Integer
  507.         bk = Val(bookMark)
  508.         If bk >= 0 And bk < MaxRow Then
  509.             GetArrayIndex = bk
  510.             Exit Function
  511.         End If
  512.  
  513.     End If
  514.     
  515.     'We should never get here.  Return an index that is "way bad"
  516.     'such that minor increments of the value do not produce a
  517.     'valid index.  This simplifies code elsewhere.
  518.     
  519.     GetArrayIndex = -2000
  520.  
  521. End Function
  522.  
  523. '
  524. 'Set up some buttons to emulate a Data Control
  525. '
  526. 'Special bookmarks can be generated from internal
  527. 'knowledge of the data storage method (an array index)
  528. '
  529. 'When possible, it is best obtain bookmarks from the
  530. 'grid rather than manufacturing them.  This insures
  531. 'consistency of bookmarks better than any other method.
  532. '
  533. 'In some cases, special bookmarks may require local
  534. 'generation - e.g. First and Last.  In these cases,
  535. 'note that our VBA makeBookmark() function is used to
  536. 'insure bookmark consistency
  537. '
  538. Private Sub cmdPhonyDCFirst_Click()
  539.     DBGrid1.bookMark = makeBookmark(0)
  540. End Sub
  541.  
  542. Private Sub cmdPhonyDCLast_Click()
  543.     DBGrid1.bookMark = makeBookmark(MaxRow - 1)
  544. End Sub
  545.  
  546. Private Sub cmdPhonyDCNext_Click()
  547.     Dim rindex As Integer
  548.     'make sure the next row is valid
  549.     rindex = GetArrayIndex(DBGrid1.bookMark, False) + 1
  550.     If isInvalidIndex(rindex) Then
  551.         DBGrid1.SetFocus
  552.     Else
  553.         DBGrid1.bookMark = DBGrid1.GetBookmark(1)
  554.     End If
  555. End Sub
  556.  
  557. Private Sub cmdPhonyDCPrevious_Click()
  558.     Dim rindex As Integer
  559.     'make sure the previous row is valid
  560.     rindex = GetArrayIndex(DBGrid1.bookMark, False) - 1
  561.     If isInvalidIndex(rindex) Then
  562.         DBGrid1.SetFocus
  563.     Else
  564.         DBGrid1.bookMark = DBGrid1.GetBookmark(-1)
  565.     End If
  566. End Sub
  567.  
  568. '
  569. 'The Unbound Events
  570. '
  571. 'The RowBuffer object, passed to the grid events is an OLE
  572. 'object.  Though efficient, resolution of references to
  573. 'RowBuffer members requires some overhead.  Thus, we use
  574. 'local variable whenever possible to store information
  575. 'which does not change for the duration of the event,
  576. 'especially for situations involving loops.
  577. '
  578. 'Thus, RowBuf.RowCount and RowBuf.ColumnCount values are
  579. 'cached in local variables for the duration of the event.
  580. '
  581. Private Sub DBGrid1_UnboundAddData(ByVal RowBuf As RowBuffer, _
  582.                 NewRowBookmark As Variant)
  583.     
  584.     'reallocate the array to include an extra row
  585.     ReDim Preserve dataval(0 To MaxCol - 1, 0 To MaxRow)
  586.  
  587.     'Get the column limit of the columns to be processed.
  588.     Dim collimit As Integer     'limit of RowBuffer columns
  589.     collimit = RowBuf.ColumnCount - 1
  590.     
  591.     'check each column for an updated value.  For Add and
  592.     'Write operations, the RowBuffer object is a "sparse"
  593.     'storage object, containing Null values for row/column
  594.     'combinations which have not been modified and therefore
  595.     'should not be used as data.
  596.     
  597.     Dim col As Integer          'column indicator for RowBuffer
  598.     
  599.     For col = 0 To collimit
  600.         If Not IsNull(RowBuf.Value(0, col)) Then
  601.             dataval(col, MaxRow) = RowBuf.Value(0, col)
  602.         Else
  603.             'Unbound mode does not have a database to fill in
  604.             'the default values.  We can use what is stored in
  605.             'the column default, or we stick in anything else we
  606.             'wanted, including something that depends on the other
  607.             'column or row data.  But in this case, we'll just
  608.             'use the column default.
  609.             dataval(col, MaxRow) = DBGrid1.Columns(col).DefaultValue
  610.         End If
  611.     Next col
  612.     
  613.     'set the bookmark for the added row
  614.     NewRowBookmark = makeBookmark(MaxRow)
  615.  
  616.     'increment the row count
  617.     MaxRow = MaxRow + 1
  618.  
  619. End Sub
  620.  
  621. Private Sub DBGrid1_UnboundDeleteRow(bookMark As Variant)
  622.  
  623.     'if there are no rows to delete, set the bookmark to Null
  624.     'to indicate an error and return immediately.
  625.  
  626.     If MaxRow = 0 Then
  627.         bookMark = Null
  628.         Exit Sub
  629.     End If
  630.     
  631.     'the grid refreshes all of its bookmarks after the deletion
  632.     'occurs.  Therefore, we can just remove the element from
  633.     'the data array.  However, if VBA code is storing bookmarks
  634.     'for later use, another approach should be taken such that
  635.     'deleted "rows" become invalid
  636.     
  637.     'get the array index of the row after the row to be deleted
  638.     Dim rindex As Integer       'dataval array index for the "row"
  639.     rindex = GetArrayIndex(bookMark, False) + 1
  640.  
  641.     'move the data after the delete row up one row, thus
  642.     'eliminating the deleted row from the data array
  643.     
  644.     Dim col As Integer          'column of data array
  645.     
  646.     While Not isInvalidIndex(rindex)
  647.         For col = 0 To MaxCol - 1
  648.             dataval(col, rindex - 1) = dataval(col, rindex)
  649.         Next col
  650.         rindex = rindex + 1
  651.     Wend
  652.     
  653.     'decrement the row count, and reallocate the array preserving
  654.     'the existing data.  If the last row is being deleted,
  655.     'it is not necessary to change the allocation.
  656.  
  657.     MaxRow = MaxRow - 1
  658.     If MaxRow <> 0 Then
  659.         ReDim Preserve dataval(0 To MaxCol - 1, 0 To MaxRow - 1)
  660.     End If
  661.  
  662. End Sub
  663.  
  664. Private Sub DBGrid1_UnboundReadData(ByVal RowBuf As RowBuffer, StartLocation As Variant, ByVal ReadPriorRows As Boolean)
  665.     
  666.     'if there is no data, then flag no rows available and return
  667.     If MaxRow = 0 Then
  668.         RowBuf.RowCount = 0
  669.         Exit Sub
  670.     End If
  671.  
  672.     Dim rowsFetched As Integer      'track count of RowBuf rows set
  673.     rowsFetched = 0     'track the number of rows we fetch
  674.     
  675.     'Unfortunately, the VB DBGrid help is misleading, even though
  676.     'the example is clear.
  677.     '  ReadPriorRows = True means the RowBuffer wants the rows
  678.     '                  BEFORE the StartLocation.
  679.     'Therefore, we must move backward in our array when filling
  680.     'the buffer.  We always move forward in the RowBuffer itself.
  681.     
  682.     Dim incr As Integer
  683.     If ReadPriorRows Then
  684.         incr = -1       'move backward in array
  685.     Else
  686.         incr = 1        'move forward in array
  687.     End If
  688.  
  689.     'Find the array index of the starting row.
  690.     Dim rindex As Integer           'the array (row) index for data
  691.     rindex = GetArrayIndex(StartLocation, ReadPriorRows)
  692.     
  693.     'The first row to receive a value, is the first increment passed
  694.     'the starting row
  695.     rindex = rindex + incr
  696.  
  697.     'use rowlimit and collimit as the number of rows and columns
  698.     'requested by the row buffer
  699.     
  700.     Dim rowlimit, collimit As Integer   'row and column limits for loop
  701.     rowlimit = RowBuf.RowCount - 1
  702.     collimit = RowBuf.ColumnCount - 1
  703.     
  704.     Dim row, col As Integer         'row and column counters for RowBuf
  705.     
  706.     For row = 0 To rowlimit
  707.         
  708.         'check to see if we are out of "rows" in the array
  709.         If isInvalidIndex(rindex) Then Exit For
  710.         
  711.         'fill in the RowBuffer columns
  712.         For col = 0 To collimit
  713.             'do not allow empty variants to be put into rowbuffer
  714.             If VarType(dataval(col, rindex)) = 0 Then
  715.                 dataval(col, rindex) = Null
  716.             End If
  717.                         
  718.             RowBuf.Value(row, col) = dataval(col, rindex)
  719.         Next col
  720.  
  721.         'derive a bookmark that makes it easy to find the array rindex
  722.         'makeBookmark creates the bookmark, GetArrayIndex interprets it.
  723.         RowBuf.bookMark(row) = makeBookmark(rindex)
  724.  
  725.         rindex = rindex + incr    'locate next "row" in array by rindex
  726.         rowsFetched = rowsFetched + 1       'track rows fetched
  727.  
  728.     Next row
  729.     
  730.     'Tell the RowBuffer how many rows were fetched
  731.     RowBuf.RowCount = rowsFetched
  732.     Exit Sub
  733.     
  734. End Sub
  735.  
  736. Private Sub DBGrid1_UnboundWriteData(ByVal RowBuf As RowBuffer, WriteLocation As Variant)
  737.  
  738.     'if there is no data avaialable, there cannot be an update.
  739.     If MaxRow = 0 Then
  740.         RowBuffer.RowCount = 0  'indicate update failure
  741.         Exit Sub
  742.     End If
  743.     
  744.     'get the array index of the desired column
  745.     Dim rindex As Integer       'dataval array index for the row
  746.     rindex = GetArrayIndex(WriteLocation, False)
  747.     
  748.     If Not isInvalidIndex(rindex) Then
  749.  
  750.         'get the maximum column to process
  751.         Dim collimit As Integer     'limit of RowBuffer columns
  752.         collimit = RowBuf.ColumnCount - 1
  753.     
  754.         'check each column for an updated value.  For Add and
  755.         'Write operations, the RowBuffer object is a "sparse"
  756.         'storage object, containing Null values for row/column
  757.         'combinations which have not been modified and therefore
  758.         'should not be used as data.
  759.     
  760.         Dim col As Integer          'column indicator for RowBuffer
  761.  
  762.         For col = 0 To collimit
  763.             If Not IsNull(RowBuf.Value(0, col)) Then
  764.                 dataval(col, rindex) = RowBuf.Value(0, col)
  765.                 colsUpdated = colsUpdated + 1
  766.             End If
  767.         Next col
  768.     
  769.     End If
  770.  
  771. End Sub
  772.  
  773. '
  774. 'Other Grid events
  775. '
  776. Private Sub DBGrid1_KeyPress(KeyAscii As Integer)
  777.  
  778.     'This KeyPress event traps the return key, and if an
  779.     'AddNew is in progress, then converts the Return into
  780.     'an Update of the Current AddNew, and starts another
  781.     'AddNew.
  782.  
  783. '** this is not functioning properly yet 
  784. '** the grid does not move to the AddNew row as intended 
  785. '** someday, when there is time ...  <g> 
  786.     If KeyAscii = 13 Then
  787.  
  788.         'if current is AddNew
  789.         If isAddNew() Then      'isAddNew given above
  790.             KeyAscii = 0
  791.             cmdAddNew_Click 'trigger another AddNew
  792.         End If
  793.  
  794.     End If
  795.  
  796. End Sub
  797.  
  798.